package com.bestcem.xm.user.service;

import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.component.security.dto.TokenDTO;
import com.bestcem.xm.user.service.dto.user.*;

import java.util.List;

/**
 * 用户多因素认证相关服务
 *
 * @author panyun <yun.pan@idiaoyan.com>
 * @date 2022/6/9 17:03
 */
public interface UserMfaSettingService {

    /**
     * 判断是否需要mfa登录
     *
     * @param orgId   租户id
     * @param userDTO 用户信息
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.JudgeNeedMfaLoginDTO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 11:11
     */
    ServiceResult<JudgeNeedMfaLoginDTO> judgeNeedMfaLogin(String orgId, UserDTO userDTO);

    /**
     * 根据orgId获取公司的用户登录多因素验证设置
     *
     * @param orgId 租户id
     * @return com.bestcem.xm.util.ServiceResult<com.bestcem.xm.user.service.dto.user.UserMfaSettingDTO>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/13 12:49
     */
    ServiceResult<UserMfaSettingDTO> getMfaSettingByOrgId(String orgId);

    /**
     * 更新用户登录多因素认证相关设置
     *
     * @param currentToken token信息
     * @param openMfa      是否开启mfa验证
     * @param authMethod   验证方式
     * @param allowSkip    是否允许15天内跳过验证
     * @param roleList     用户登录多因素认证关联的roleIdList
     * @return com.bestcem.xm.util.ServiceResult<com.google.gson.JsonObject>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/13 19:35
     */
    ServiceResult<String> updateMfaSetting(TokenDTO currentToken, Boolean openMfa, Integer authMethod, Boolean allowSkip, List<String> roleList);

    /**
     * 检查租户下所有用户未绑定的数量
     * XM.apps_mysql.user.util.utils.check_org_contact_all_bind
     *
     * @param orgId  租户id
     * @param method 验证方式 email/mobile
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/13 16:04
     */
    ServiceResult<Integer> checkOrgContactAllBind(String orgId, String method);

    /**
     * 获取未绑定手机和邮箱的公司账号
     *
     * @param org   租户
     * @param ttype 名单类型 mobile/email
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.service.dto.user.ExportMfaUnbindDTO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 17:19
     */
    ServiceResult<List<ExportMfaUnbindDTO>> genNotBindContactAccount(OrganizationDTO org, String ttype);

    /**
     * 发送mfa验证码
     * XM.apps_mysql.user.util.utils.send_mfa_vcode
     *
     * @param user       用户信息
     * @param authMethod 验证方式 【0：短信、1：邮箱】
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 18:55
     */
    void sendMfaVcode(UserDTO user, Integer authMethod);

    /**
     * 设置跳过mfa登录
     * XM.apps_mysql.auth.utils.user_set_skip_mfa
     *
     * @param userId
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/10 15:12
     */
    void userSetSkipMfa(String userId);

    /**
     * 根据userId判断是否需要跳过Mfa
     *
     * @param userId 用户id
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Boolean>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 11:03
     */
    Boolean checkUserSkipMfa(String userId);

    /**
     * 设置不允许跳过mfa时，删去已存在的跳过mfa的标识
     * XM.apps_mysql.user.util.utils.delete_skip_mfa_flag
     *
     * @param userIdList 用户id列表
     * @return void
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 15:02
     */
    void deleteSkipMfaFlag(List<String> userIdList);

    /**
     * 根据orgId更新用户登录安全验证信息
     *
     * @param dto
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Object>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/10 18:06
     */
    ServiceResult<Integer> updateById(UserMfaSettingDTO dto);

    /**
     * 新增UserMfaSetting记录
     *
     * @param dto 可选参数
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/6/14 22:10
     */
    ServiceResult<Integer> insertSelective(UserMfaSettingDTO dto);
}
